package com.lanou3g.code0411;

import com.lanou3g.code0411.exceptions.IndexOutExceptions;

/**
 * Created by dllo on 18/4/11.
 */
// 用起来和数组差不多,一个啥都能放的容器
// 并且还不需要指定初始化长度
// 能随着里面内容的多少,变大变小

// 现在的问题是
// 使用的是Object类型,啥都能放
// 如果我们能够在创建 MyArray的时候,就能确定
// 这个数组中,可以放的元素类型,那么在取出元素的时候
// 就不会产生 类型转换异常了
public class MyArray<E> {
    //动态数组扩容
    private Object[] datas;//用来放元素的数组
    private int count; //当前数组中已经存放的元素个数

    public MyArray() {
        //先定义一个能放10个元素的数组
        //之所以取10,是随意写的
        datas = new Object[10];
        count = 0;
    }

    public void put(E object) {
        //放元素
        datas[count] = object;
        count++;
        //放满了,怎么办?
        if (count == datas.length) {
            //放满了
            //创建一个新数组,是原来数组长度的2倍
            Object[] newArr = new Object[datas.length * 2];
            //把旧数组中的所有元素放到新数组中
            for (int i = 0; i < datas.length; i++) {
                newArr[i] = datas[i];
            }
            //把datas重新赋值成新的大的数组
            datas = newArr;

        }
    }

    public E get(int index) {
        //使用异常机制来解决
        //根据下标取元素
        if (index < 0 || index >= count) {
            //如果输入的索引超出了我们支持的范围
            //那么我们就让程序崩溃,并给出确切的错误信息
            throw new IndexOutExceptions(count - 1, index);
        }
        return (E) datas[index];
    }

    public void remove(int index) {

        //根据下标 删除元素
    }

    public int size() {
        return count;
    }
}

